Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

263
Visualizações
no se puede acceder a la matriz definida en un archivo externo, sin la palabra clave "externo"

Descubro que no importa cómo, no puedo acceder a una matriz definida en un archivo externo. Así que hago algunas pruebas simples como estas tanto en C como en C++:

Cª:

C Principal

 #include<stdio.h> #include<string.h> #include<stdlib.h> int func(); char arr[100]=""; int main() { for(int i=0;i<=9;++i){ func(); printf("%s\n",arr); } return 0; }

func.c

 #include<string.h> #include<stdio.h> extern char* arr; int func(){ strcat(arr,"hello"); // try to access arr here return 0; }

En C++:

principal.cpp

 #include<iostream> using namespace std; int func(); char arr[100]=""; int main() { for(int i=0;i<=10;++i){ func(); cout<<arr<<endl; } return 0; }

func.cpp

 #include<cstring> extern char* arr; int func(){ strcat(arr,"hello"); // try to access arr here return 0; }

Prueba bastante simple como puedes ver. No importa qué método use para acceder a una matriz en un archivo externo, obtuve una falla de segmentación.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

La vinculación de variables no es de tipo seguro.

El problema es que está definiendo el nombre "arr" para referirse a una matriz.
Suponiendo que la matriz se encuentra en la dirección 0x10, se parece a esto:

 Address 0x10 0x11 0x12 0x13 Content | 0 | 0 | 0 | 0 | (... 100 zeroes in total)

El nombre "arr" se refiere a la ubicación donde se almacena esta matriz.

En "func.cpp" (y "func.c" - funcionan exactamente igual) afirma, o declara , que el nombre "arr" se refiere a un puntero.
Esto es una mentira porque no es lo que usted definió, pero el compilador y el enlazador confían ciegamente en usted.

Esta mentira hace que el código en func interprete el valor almacenado en la dirección 0x10 como un puntero en lugar de una matriz.
Con punteros de 32 bits, eso sería

 Address 0x10 0x14 Content | 0 | 0 | (...)

Y cuando strcat a 0 , las cosas no van bien.

Si almacena algo más distinto que los ceros en la matriz (por ejemplo, "\1\2\3\4" ) y examina el puntero en un depurador, será más obvio que los elementos de la matriz se han "convertido" en el valor del puntero.

La solución es hacer el reclamo adecuado; ese arr es una matriz:

 extern char arr[];

(Tenga en cuenta que en las declaraciones de variables, a diferencia de los parámetros de funciones, char arr[] no es lo mismo que char* arr ).

over 4 years ago · Santiago Trujillo Relatório

0

Usar

 extern char arr[];

en vez de

 extern char* arr;

Aunque una matriz se convierte implícitamente en un puntero en muchas situaciones en C, una matriz no es lo mismo que un puntero. Lo que tienes es un puntero, no una declaración. La declaración en func.c no coincide con la definición en main.c.

over 4 years ago · Santiago Trujillo Relatório

0

Lo simple es que debe usar la palabra clave externa en ambos lugares.
en principal.c

 extern char arr[100]="";

y en func.c

 extern char *arr;

esto le dirá al compilador que arr es un nombre de variable externo, para que se pueda acceder a él en otros archivos.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda